# 基础镜像
FROM node:18-alpine AS base

# 安装依赖阶段
FROM base AS deps
WORKDIR /app

# 更换为国内镜像源并安装 ngrok 所需工具
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
    apk update && \
    apk add --no-cache curl unzip wget # 添加 wget 以备 ngrok API 查询（可选）

# 安装 ngrok
RUN curl -Lo ngrok.zip https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-amd64.zip && \
    unzip ngrok.zip && \
    rm ngrok.zip && \
    chmod +x ngrok && \
    mv ngrok /usr/local/bin/

# 安装 SQLite 和构建工具
RUN apk add --no-cache python3 make g++ sqlite

# 复制 package.json 和 package-lock.json
COPY package.json package-lock.json* ./

# 安装依赖
RUN npm ci --legacy-peer-deps

# 构建阶段
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .

# 构建应用
RUN npm run build

# 运行阶段
FROM base AS runner
WORKDIR /app

# 安装运行所需的依赖: SQLite, curl, unzip (ngrok 已在 deps 阶段安装并可从 /usr/local/bin 访问)
# 我们需要确保 ngrok 在这个最终阶段是可用的。
# 如果 /usr/local/bin/ngrok 没有从 base 继承过来，需要重新安装
# 为了保险起见，并且如果构建上下文不共享 /usr/local/bin, 在 runner 阶段也确保 ngrok 存在
RUN apk update && apk add --no-cache sqlite curl unzip wget && \
    if ! command -v ngrok > /dev/null; then \
      echo "ngrok not found, installing..."; \
      curl -Lo ngrok.zip https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-amd64.zip && \
      unzip ngrok.zip && \
      rm ngrok.zip && \
      chmod +x ngrok && \
      mv ngrok /usr/local/bin/; \
    fi

# 创建数据目录并设置权限
# /app 目录本身通常由 WORKDIR 创建，这里确保 data 子目录存在且权限正确
RUN mkdir -p /app/data && \
    chown -R node:node /app

# 设置环境变量
ENV NODE_ENV production
ENV PORT 3000
# NGROK_AUTHTOKEN 会在 docker run 时传入

# 复制构建产物
COPY --from=builder /app/public ./public
COPY --from=builder --chown=node:node /app/.next/standalone ./
COPY --from=builder --chown=node:node /app/.next/static ./.next/static

# 复制我们自定义的启动脚本
COPY start.sh /app/start.sh
# 赋予启动脚本执行权限
RUN chmod +x /app/start.sh && \
    chown node:node /app/start.sh # 确保 node 用户可以执行

# 切换到非 root 用户
USER node

# 暴露端口
EXPOSE 3000

# 直接使用node命令启动应用，避免使用start.sh脚本
CMD ["node", "server.js"]